home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 22 / PCPP #22.iso / Quake2 / q2source_12_11 / utils3 / common / qfiles.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-15  |  10.4 KB  |  466 lines

  1.  
  2. //
  3. // qfiles.h: quake file formats
  4. // This file must be identical in the quake and utils directories
  5. //
  6.  
  7. /*
  8. ========================================================================
  9.  
  10. The .pak files are just a linear collapse of a directory tree
  11.  
  12. ========================================================================
  13. */
  14.  
  15. #define IDPAKHEADER        (('K'<<24)+('C'<<16)+('A'<<8)+'P')
  16.  
  17. typedef struct
  18. {
  19.     char    name[56];
  20.     int        filepos, filelen;
  21. } dpackfile_t;
  22.  
  23. typedef struct
  24. {
  25.     int        ident;        // == IDPAKHEADER
  26.     int        dirofs;
  27.     int        dirlen;
  28. } dpackheader_t;
  29.  
  30. #define    MAX_FILES_IN_PACK    4096
  31.  
  32.  
  33. /*
  34. ========================================================================
  35.  
  36. PCX files are used for as many images as possible
  37.  
  38. ========================================================================
  39. */
  40.  
  41. typedef struct
  42. {
  43.     char    manufacturer;
  44.     char    version;
  45.     char    encoding;
  46.     char    bits_per_pixel;
  47.     unsigned short    xmin,ymin,xmax,ymax;
  48.     unsigned short    hres,vres;
  49.     unsigned char    palette[48];
  50.     char    reserved;
  51.     char    color_planes;
  52.     unsigned short    bytes_per_line;
  53.     unsigned short    palette_type;
  54.     char    filler[58];
  55.     unsigned char    data;            // unbounded
  56. } pcx_t;
  57.  
  58.  
  59. /*
  60. ========================================================================
  61.  
  62. .MD2 triangle model file format
  63.  
  64. ========================================================================
  65. */
  66.  
  67. #define IDALIASHEADER        (('2'<<24)+('P'<<16)+('D'<<8)+'I')
  68. #define ALIAS_VERSION    8
  69.  
  70. #define    MAX_TRIANGLES    4096
  71. #define MAX_VERTS        2048
  72. #define MAX_FRAMES        512
  73. #define MAX_MD2SKINS    32
  74. #define    MAX_SKINNAME    64
  75.  
  76. typedef struct
  77. {
  78.     short    s;
  79.     short    t;
  80. } dstvert_t;
  81.  
  82. typedef struct 
  83. {
  84.     short    index_xyz[3];
  85.     short    index_st[3];
  86. } dtriangle_t;
  87.  
  88. typedef struct
  89. {
  90.     byte    v[3];            // scaled byte to fit in frame mins/maxs
  91.     byte    lightnormalindex;
  92. } dtrivertx_t;
  93.  
  94. #define DTRIVERTX_V0   0
  95. #define DTRIVERTX_V1   1
  96. #define DTRIVERTX_V2   2
  97. #define DTRIVERTX_LNI  3
  98. #define DTRIVERTX_SIZE 4
  99.  
  100. typedef struct
  101. {
  102.     float        scale[3];    // multiply byte verts by this
  103.     float        translate[3];    // then add this
  104.     char        name[16];    // frame name from grabbing
  105.     dtrivertx_t    verts[1];    // variable sized
  106. } daliasframe_t;
  107.  
  108.  
  109. // the glcmd format:
  110. // a positive integer starts a tristrip command, followed by that many
  111. // vertex structures.
  112. // a negative integer starts a trifan command, followed by -x vertexes
  113. // a zero indicates the end of the command list.
  114. // a vertex consists of a floating point s, a floating point t,
  115. // and an integer vertex index.
  116.  
  117.  
  118. typedef struct
  119. {
  120.     int            ident;
  121.     int            version;
  122.  
  123.     int            skinwidth;
  124.     int            skinheight;
  125.     int            framesize;        // byte size of each frame
  126.  
  127.     int            num_skins;
  128.     int            num_xyz;
  129.     int            num_st;            // greater than num_xyz for seams
  130.     int            num_tris;
  131.     int            num_glcmds;        // dwords in strip/fan command list
  132.     int            num_frames;
  133.  
  134.     int            ofs_skins;        // each skin is a MAX_SKINNAME string
  135.     int            ofs_st;            // byte offset from start for stverts
  136.     int            ofs_tris;        // offset for dtriangles
  137.     int            ofs_frames;        // offset for first frame
  138.     int            ofs_glcmds;    
  139.     int            ofs_end;        // end of file
  140.  
  141. } dmdl_t;
  142.  
  143. /*
  144. ========================================================================
  145.  
  146. .SP2 sprite file format
  147.  
  148. ========================================================================
  149. */
  150.  
  151. #define IDSPRITEHEADER    (('2'<<24)+('S'<<16)+('D'<<8)+'I')
  152.         // little-endian "IDS2"
  153. #define SPRITE_VERSION    2
  154.  
  155. typedef struct
  156. {
  157.     int        width, height;
  158.     int        origin_x, origin_y;        // raster coordinates inside pic
  159.     char    name[MAX_SKINNAME];        // name of pcx file
  160. } dsprframe_t;
  161.  
  162. typedef struct {
  163.     int            ident;
  164.     int            version;
  165.     int            numframes;
  166.     dsprframe_t    frames[1];            // variable sized
  167. } dsprite_t;
  168.  
  169. /*
  170. ==============================================================================
  171.  
  172.   .WAL texture file format
  173.  
  174. ==============================================================================
  175. */
  176.  
  177.  
  178. #define    MIPLEVELS    4
  179. typedef struct miptex_s
  180. {
  181.     char        name[32];
  182.     unsigned    width, height;
  183.     unsigned    offsets[MIPLEVELS];        // four mip maps stored
  184.     char        animname[32];            // next frame in animation chain
  185.     int            flags;
  186.     int            contents;
  187.     int            value;
  188. } miptex_t;
  189.  
  190.  
  191.  
  192. /*
  193. ==============================================================================
  194.  
  195.   .BSP file format
  196.  
  197. ==============================================================================
  198. */
  199.  
  200. #define IDBSPHEADER    (('P'<<24)+('S'<<16)+('B'<<8)+'I')
  201.         // little-endian "IBSP"
  202.  
  203. #define BSPVERSION    38
  204.  
  205.  
  206. // upper design bounds
  207. // leaffaces, leafbrushes, planes, and verts are still bounded by
  208. // 16 bit short limits
  209. #define    MAX_MAP_MODELS        1024
  210. #define    MAX_MAP_BRUSHES        8192
  211. #define    MAX_MAP_ENTITIES    2048
  212. #define    MAX_MAP_ENTSTRING    0x40000
  213. #define    MAX_MAP_TEXINFO        8192
  214.  
  215. #define    MAX_MAP_AREAS        256
  216. #define    MAX_MAP_AREAPORTALS    1024
  217. #define    MAX_MAP_PLANES        65536
  218. #define    MAX_MAP_NODES        65536
  219. #define    MAX_MAP_BRUSHSIDES    65536
  220. #define    MAX_MAP_LEAFS        65536
  221. #define    MAX_MAP_VERTS        65536
  222. #define    MAX_MAP_FACES        65536
  223. #define    MAX_MAP_LEAFFACES    65536
  224. #define    MAX_MAP_LEAFBRUSHES 65536
  225. #define    MAX_MAP_PORTALS        65536
  226. #define    MAX_MAP_EDGES        128000
  227. #define    MAX_MAP_SURFEDGES    256000
  228. #define    MAX_MAP_LIGHTING    0x200000
  229. #define    MAX_MAP_VISIBILITY    0x100000
  230.  
  231. // key / value pair sizes
  232.  
  233. #define    MAX_KEY        32
  234. #define    MAX_VALUE    1024
  235.  
  236. //=============================================================================
  237.  
  238. typedef struct
  239. {
  240.     int        fileofs, filelen;
  241. } lump_t;
  242.  
  243. #define    LUMP_ENTITIES        0
  244. #define    LUMP_PLANES            1
  245. #define    LUMP_VERTEXES        2
  246. #define    LUMP_VISIBILITY        3
  247. #define    LUMP_NODES            4
  248. #define    LUMP_TEXINFO        5
  249. #define    LUMP_FACES            6
  250. #define    LUMP_LIGHTING        7
  251. #define    LUMP_LEAFS            8
  252. #define    LUMP_LEAFFACES        9
  253. #define    LUMP_LEAFBRUSHES    10
  254. #define    LUMP_EDGES            11
  255. #define    LUMP_SURFEDGES        12
  256. #define    LUMP_MODELS            13
  257. #define    LUMP_BRUSHES        14
  258. #define    LUMP_BRUSHSIDES        15
  259. #define    LUMP_POP            16
  260. #define    LUMP_AREAS            17
  261. #define    LUMP_AREAPORTALS    18
  262. #define    HEADER_LUMPS        19
  263.  
  264. typedef struct
  265. {
  266.     int            ident;
  267.     int            version;    
  268.     lump_t        lumps[HEADER_LUMPS];
  269. } dheader_t;
  270.  
  271. typedef struct
  272. {
  273.     float        mins[3], maxs[3];
  274.     float        origin[3];        // for sounds or lights
  275.     int            headnode;
  276.     int            firstface, numfaces;    // submodels just draw faces
  277.                                         // without walking the bsp tree
  278. } dmodel_t;
  279.  
  280.  
  281. typedef struct
  282. {
  283.     float    point[3];
  284. } dvertex_t;
  285.  
  286.  
  287. // 0-2 are axial planes
  288. #define    PLANE_X            0
  289. #define    PLANE_Y            1
  290. #define    PLANE_Z            2
  291.  
  292. // 3-5 are non-axial planes snapped to the nearest
  293. #define    PLANE_ANYX        3
  294. #define    PLANE_ANYY        4
  295. #define    PLANE_ANYZ        5
  296.  
  297. // planes (x&~1) and (x&~1)+1 are allways opposites
  298.  
  299. typedef struct
  300. {
  301.     float    normal[3];
  302.     float    dist;
  303.     int        type;        // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
  304. } dplane_t;
  305.  
  306.  
  307. // contents flags are seperate bits
  308. // a given brush can contribute multiple content bits
  309. // multiple brushes can be in a single leaf
  310.  
  311. // these definitions also need to be in q_shared.h!
  312.  
  313. // lower bits are stronger, and will eat weaker brushes completely
  314. #define    CONTENTS_SOLID            1        // an eye is never valid in a solid
  315. #define    CONTENTS_WINDOW            2        // translucent, but not watery
  316. #define    CONTENTS_AUX            4
  317. #define    CONTENTS_LAVA            8
  318. #define    CONTENTS_SLIME            16
  319. #define    CONTENTS_WATER            32
  320. #define    CONTENTS_MIST            64
  321. #define    LAST_VISIBLE_CONTENTS    64
  322.  
  323. // remaining contents are non-visible, and don't eat brushes
  324.  
  325. #define    CONTENTS_AREAPORTAL        0x8000
  326.  
  327. #define    CONTENTS_PLAYERCLIP        0x10000
  328. #define    CONTENTS_MONSTERCLIP    0x20000
  329.  
  330. // currents can be added to any other contents, and may be mixed
  331. #define    CONTENTS_CURRENT_0        0x40000
  332. #define    CONTENTS_CURRENT_90        0x80000
  333. #define    CONTENTS_CURRENT_180    0x100000
  334. #define    CONTENTS_CURRENT_270    0x200000
  335. #define    CONTENTS_CURRENT_UP        0x400000
  336. #define    CONTENTS_CURRENT_DOWN    0x800000
  337.  
  338. #define    CONTENTS_ORIGIN            0x1000000    // removed before bsping an entity
  339.  
  340. #define    CONTENTS_MONSTER        0x2000000    // should never be on a brush, only in game
  341. #define    CONTENTS_DEADMONSTER    0x4000000
  342. #define    CONTENTS_DETAIL            0x8000000    // brushes to be added after vis leafs
  343. #define    CONTENTS_TRANSLUCENT    0x10000000    // auto set if any surface has trans
  344. #define    CONTENTS_LADDER            0x20000000
  345.  
  346.  
  347.  
  348. #define    SURF_LIGHT        0x1        // value will hold the light strength
  349.  
  350. #define    SURF_SLICK        0x2        // effects game physics
  351.  
  352. #define    SURF_SKY        0x4        // don't draw, but add to skybox
  353. #define    SURF_WARP        0x8        // turbulent water warp
  354. #define    SURF_TRANS33    0x10
  355. #define    SURF_TRANS66    0x20
  356. #define    SURF_FLOWING    0x40    // scroll towards angle
  357. #define    SURF_NODRAW        0x80    // don't bother referencing the texture
  358.  
  359. #define    SURF_HINT        0x100    // make a primary bsp splitter
  360. #define    SURF_SKIP        0x200    // completely ignore, allowing non-closed brushes
  361.  
  362.  
  363.  
  364. typedef struct
  365. {
  366.     int            planenum;
  367.     int            children[2];    // negative numbers are -(leafs+1), not nodes
  368.     short        mins[3];        // for frustom culling
  369.     short        maxs[3];
  370.     unsigned short    firstface;
  371.     unsigned short    numfaces;    // counting both sides
  372. } dnode_t;
  373.  
  374.  
  375. typedef struct texinfo_s
  376. {
  377.     float        vecs[2][4];        // [s/t][xyz offset]
  378.     int            flags;            // miptex flags + overrides
  379.     int            value;            // light emission, etc
  380.     char        texture[32];    // texture name (textures/*.wal)
  381.     int            nexttexinfo;    // for animations, -1 = end of chain
  382. } texinfo_t;
  383.  
  384.  
  385. // note that edge 0 is never used, because negative edge nums are used for
  386. // counterclockwise use of the edge in a face
  387. typedef struct
  388. {
  389.     unsigned short    v[2];        // vertex numbers
  390. } dedge_t;
  391.  
  392. #define    MAXLIGHTMAPS    4
  393. typedef struct
  394. {
  395.     unsigned short    planenum;
  396.     short        side;
  397.  
  398.     int            firstedge;        // we must support > 64k edges
  399.     short        numedges;    
  400.     short        texinfo;
  401.  
  402. // lighting info
  403.     byte        styles[MAXLIGHTMAPS];
  404.     int            lightofs;        // start of [numstyles*surfsize] samples
  405. } dface_t;
  406.  
  407. typedef struct
  408. {
  409.     int                contents;            // OR of all brushes (not needed?)
  410.  
  411.     short            cluster;
  412.     short            area;
  413.  
  414.     short            mins[3];            // for frustum culling
  415.     short            maxs[3];
  416.  
  417.     unsigned short    firstleafface;
  418.     unsigned short    numleaffaces;
  419.  
  420.     unsigned short    firstleafbrush;
  421.     unsigned short    numleafbrushes;
  422. } dleaf_t;
  423.  
  424. typedef struct
  425. {
  426.     unsigned short    planenum;        // facing out of the leaf
  427.     short    texinfo;
  428. } dbrushside_t;
  429.  
  430. typedef struct
  431. {
  432.     int            firstside;
  433.     int            numsides;
  434.     int            contents;
  435. } dbrush_t;
  436.  
  437. #define    ANGLE_UP    -1
  438. #define    ANGLE_DOWN    -2
  439.  
  440.  
  441. // the visibility lump consists of a header with a count, then
  442. // byte offsets for the PVS and PHS of each cluster, then the raw
  443. // compressed bit vectors
  444. #define    DVIS_PVS    0
  445. #define    DVIS_PHS    1
  446. typedef struct
  447. {
  448.     int            numclusters;
  449.     int            bitofs[8][2];    // bitofs[numclusters][2]
  450. } dvis_t;
  451.  
  452. // each area has a list of portals that lead into other areas
  453. // when portals are closed, other areas may not be visible or
  454. // hearable even if the vis info says that it should be
  455. typedef struct
  456. {
  457.     int        portalnum;
  458.     int        otherarea;
  459. } dareaportal_t;
  460.  
  461. typedef struct
  462. {
  463.     int        numareaportals;
  464.     int        firstareaportal;
  465. } darea_t;
  466.